#ifndef __MC_MATH_H_
#define __MC_MATH_H_


#ifdef __cplusplus
extern "C"{
#endif
    
#include "mc_type.h"

#define _IQfvalue(fvalue,Qvalue)   ((s16)((float)fvalue*((1<<Qvalue) - 1))) 
#define _IQmpy(A,B,Q)       ((A)*(B)>>Q)
#define _IQmpy32(A,B,Q)     ((int64_t)(A)*(B)>>Q)
#define _IQsat(A,Max,Min)   ((A)>Max?Max:(A<Min?Min:A))
#define _IQabs(A)           ((A)>=0?(A):(-A))
#define _IQsign(A)          ((A)<0?(-1):1)
#define _IQreal2intdec(A,Int,Dec)   {Int=(s16)(A);Dec=((A)-Int)*32767.0;}
#define _IQintdec2real(Int,Dec,A)   {(A)=Int+Dec/32767.0;}

#define _GetSysQ(fReal) ((fReal<1.0)?15:(fReal<2.0)?14:(fReal<4.0)?13:(fReal<8.0)?12:(fReal<16.0)?11:(fReal<32.0)?10:\
		                     (fReal<64.0)?9:(fReal<128.0)?8:((fReal<256.0)?7:0))
#define _GetIQ(fReal)   ((s16)((float)(1<<_GetSysQ(fReal))*fReal)) //(((s16)((float)(1<<_GetSysQ(fReal))*fReal-1)) < 0 )? 0:(((s16)((float)(1<<_GetSysQ(fReal))*fReal-1)))


s16 MC_Div(s16 num);		
s16 MC_SinCos(s16 theta);
void MC_ArcMod(pCordic_t pCordic_Handle);

void MC_Clarke(ABC_t ABC, pAlBe_t pAlBe);
void MC_Park(AlBe_t AlBe, pDQ_t pDQ, SinCos_t SinCos);
void MC_IPark(DQ_t DQ, pAlBe_t pAlBe, SinCos_t SinCos);
void MC_IClarke(AlBe_t AlBe, pABC_t pABC);
void MC_IClarkePow(AlBe_t AlBe, pABC_t pABC);

void MC_SoftDelay(u32 cnt);
s16 MC_Filter(s16 In, s16 Out, s16 Filter);
void MC_IntDec(pIntDec_t pIntDec_Handle);
		
#ifdef __cplusplus
}
#endif


#endif

